# SPACEHANDLER.VIEW3D.DRAW
#Thomas Fischer, 10th of June 2007
# updated on 11th of March 2008: added face display and number to display
import Blender
from Blender.BGL import *
from Blender import Draw, Registry, Window, Object, Scene, Mesh

scriptname = "vertexoverlay"
doCache = True

id = Window.GetAreaID()
view3ds = Window.GetScreenInfo(Window.Types.VIEW3D)
#IPCData = Registry.GetKey(scriptname, doCache)

for view in view3ds:
	if view['id'] == id:
		x, y, xmax, ymax = view['vertices']
		w, h = (xmax - x), (ymax - y) # w, h = Window.GetAreaSize()

glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glShadeModel (GL_FLAT);
glClearColor (0.0, 0.0, 0.0, 0.0);

glViewport(x, y, w, h);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D (0.0, w, 0.0, h);
glTranslatef(0,h,0)
glScalef(1, -1,0)

glMatrixMode(GL_MODELVIEW)
glLoadIdentity()



statusverts = ""
selectedverts = []

statusedges = ""
selectededges = []

statusfaces = ""
selectedfaces = []

obj = Object.GetSelected()[0]
if obj.getType() == "Mesh":
    obj = Mesh.Get(obj.getData(True, False))

    for i in obj.verts:
        if i.sel:
            selectedverts.append(str(i.index))
    if len(selectedverts) > 0 and len(selectedverts) <= 20:
        statusverts = "selected nodes: %s" % ", ".join(selectedverts)
    elif len(selectedverts) > 20:
        statusverts = "selected %d nodes!" % (len(selectedverts))
    elif len(selectedverts) == 0:
        statusverts = "selected nodes: none"
    
    
    for e in obj.edges:
        if e.sel:
            selectededges.append(str(e.index))
    if len(selectededges) > 0 and len(selectededges) <= 20:
        statusedges = "selected beams: %s" % ", ".join(selectededges)
    elif len(selectededges) > 20:
        statusedges = "selected %s beams!" % len(selectededges)
    elif len(selectededges) == 0:
        statusedges = "selected beams: none"

    for e in obj.faces:
        if e.sel:
            selectedfaces.append(e)
    if len(selectedfaces) > 0 and len(selectedfaces) <= 20:
		faces=[]
		for f in selectedfaces:
			s = "%d_%d_%d" % (f.v[0].index, f.v[1].index, f.v[2].index)
			faces.append(s)
		statusfaces = "selected faces: %s" % ", ".join(faces)
    elif len(selectedfaces) > 20:
        statusedges = "selected %d faces!" % len(selectedfaces)
    elif len(selectedfaces) == 0:
        statusedges = "selected faces: none"

else:
    statusverts = "selected non mesh:"
    statusedges = "%s" % str(obj)
#Window.EditMode(emode)

w = Draw.GetStringWidth(statusverts, "small")
w1 = Draw.GetStringWidth(statusedges, "small")
if w1 > w:
    w = w1


glPushMatrix()
glTranslatef(5, 5, 0)
glBegin (GL_POLYGON) 
glColor4f(1, 1, 1, 0.4)
glVertex3f(0, 0, 0)
glVertex3f(w + 5, 0,0)
glVertex3f(w + 5, 45, 0)
glVertex3f(0, 45, 0)
glEnd()

glColor4f(0, 0, 1, 1)
glRasterPos2f(1,10)
Draw.Text(statusverts, "small")
glRasterPos2f(1,25)
Draw.Text(statusedges, "small")
glRasterPos2f(1,40)
Draw.Text(statusfaces, "small")
glPopMatrix()
